package com.knowledge.plus.java8.函数式接口;

import java.util.function.Function;

/**
 * Function<T,R> 函数型接口：接受一个输入参数，返回一个结果
 * 这个接口常用于函数式编程和lambda表达式的场景
 * -
 * 示例 {@link com.easy.utils.StreamUtilsTests#functionTest()}
 *
 * @author TPF
 * @since 2023/12/5
 */
class FunctionDemo {

    public static void main(String[] args) {
        /*
         * 示例1：
         * 使用lambda表达式 x -> x + 3 来初始化一个 Function<Integer, Integer> 类型的变量
         */
        Function<Integer, Integer> addThree = x -> x + 3;
        int result = addThree.apply(5); // 输出 8
        System.out.println(result);

        /*
         * 示例2：
         */
        Integer calculate = calculate(Integer::parseInt);
        System.out.println("value = " + calculate); // value = 666

        /*
         * 示例2：匿名内部类写法
         */
        Integer calculate2 = calculate(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                return Integer.parseInt(s);
            }
        });
        System.out.println("value2 = " + calculate2);   // value2 = 666
    }

    /**
     * @param function 函数式参数
     */
    public static <R> R calculate(Function<String, R> function) {
        R apply = function.apply("666"); // 获取数据进行处理后返回
        // ...do something
        return apply;
    }

}
